//package com.sunxd.integration.platform.test;
//
//import org.mybatis.spring.annotation.MapperScan;
//import org.mybatis.spring.annotation.MapperScans;
//import org.mybatis.spring.mapper.MapperFactoryBean;
//import org.mybatis.spring.mapper.MapperScannerConfigurer;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.config.BeanDefinition;
//import org.springframework.beans.factory.support.AbstractBeanDefinition;
//import org.springframework.beans.factory.support.BeanDefinitionBuilder;
//import org.springframework.beans.factory.support.BeanDefinitionRegistry;
//import org.springframework.beans.factory.support.BeanNameGenerator;
//import org.springframework.context.ResourceLoaderAware;
//import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
//import org.springframework.core.annotation.AnnotationAttributes;
//import org.springframework.core.io.ResourceLoader;
//import org.springframework.core.type.AnnotationMetadata;
//import org.springframework.util.ClassUtils;
//import org.springframework.util.StringUtils;
//
//import java.lang.annotation.Annotation;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//import java.util.stream.Collectors;
//
//public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware {
//
//  /**
//   * {@inheritDoc}
//   *
//   * @deprecated Since 2.0.2, this method not used never.
//   */
//  @Override
//  @Deprecated
//  public void setResourceLoader(ResourceLoader resourceLoader) {
//    // NOP
//  }
//
//  /**
//   * {@inheritDoc}
//   */
//  @Override
//  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//    AnnotationAttributes mapperScanAttrs = AnnotationAttributes
//        .fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));
//    if (mapperScanAttrs != null) {
//      registerBeanDefinitions(importingClassMetadata, mapperScanAttrs, registry,
//          generateBaseBeanName(importingClassMetadata, 0));
//    }
//  }
//
//  void registerBeanDefinitions(AnnotationMetadata annoMeta, AnnotationAttributes annoAttrs,
//      BeanDefinitionRegistry registry, String beanName) {
//
//    BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class);
//    builder.addPropertyValue("processPropertyPlaceHolders", true);
//
//    Class<? extends Annotation> annotationClass = annoAttrs.getClass("annotationClass");
//    if (!Annotation.class.equals(annotationClass)) {
//      builder.addPropertyValue("annotationClass", annotationClass);
//    }
//
//    Class<?> markerInterface = annoAttrs.getClass("markerInterface");
//    if (!Class.class.equals(markerInterface)) {
//      builder.addPropertyValue("markerInterface", markerInterface);
//    }
//
//    Class<? extends BeanNameGenerator> generatorClass = annoAttrs.getClass("nameGenerator");
//    if (!BeanNameGenerator.class.equals(generatorClass)) {
//      builder.addPropertyValue("nameGenerator", BeanUtils.instantiateClass(generatorClass));
//    }
//
//    Class<? extends MapperFactoryBean> mapperFactoryBeanClass = annoAttrs.getClass("factoryBean");
//    if (!MapperFactoryBean.class.equals(mapperFactoryBeanClass)) {
//      builder.addPropertyValue("mapperFactoryBeanClass", mapperFactoryBeanClass);
//    }
//
//    String sqlSessionTemplateRef = annoAttrs.getString("sqlSessionTemplateRef");
//    if (StringUtils.hasText(sqlSessionTemplateRef)) {
//      builder.addPropertyValue("sqlSessionTemplateBeanName", annoAttrs.getString("sqlSessionTemplateRef"));
//    }
//
//    String sqlSessionFactoryRef = annoAttrs.getString("sqlSessionFactoryRef");
//    if (StringUtils.hasText(sqlSessionFactoryRef)) {
//      builder.addPropertyValue("sqlSessionFactoryBeanName", annoAttrs.getString("sqlSessionFactoryRef"));
//    }
//
//    List<String> basePackages = new ArrayList<>();
//    basePackages.addAll(
//        Arrays.stream(annoAttrs.getStringArray("value")).filter(StringUtils::hasText).collect(Collectors.toList()));
//
//    basePackages.addAll(Arrays.stream(annoAttrs.getStringArray("basePackages")).filter(StringUtils::hasText)
//        .collect(Collectors.toList()));
//
//    basePackages.addAll(Arrays.stream(annoAttrs.getClassArray("basePackageClasses")).map(ClassUtils::getPackageName)
//        .collect(Collectors.toList()));
//
//    if (basePackages.isEmpty()) {
//      basePackages.add(getDefaultBasePackage(annoMeta));
//    }
//
//    String lazyInitialization = annoAttrs.getString("lazyInitialization");
//    if (StringUtils.hasText(lazyInitialization)) {
//      builder.addPropertyValue("lazyInitialization", lazyInitialization);
//    }
//
//    String defaultScope = annoAttrs.getString("defaultScope");
//    if (!AbstractBeanDefinition.SCOPE_DEFAULT.equals(defaultScope)) {
//      builder.addPropertyValue("defaultScope", defaultScope);
//    }
//
//    builder.addPropertyValue("basePackage", StringUtils.collectionToCommaDelimitedString(basePackages));
//
//    // for spring-native
//    builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
//
//    registry.registerBeanDefinition(beanName, builder.getBeanDefinition());
//
//  }
//
//  private static String generateBaseBeanName(AnnotationMetadata importingClassMetadata, int index) {
//    return importingClassMetadata.getClassName() + "#" + MapperScannerRegistrar.class.getSimpleName() + "#" + index;
//  }
//
//  private static String getDefaultBasePackage(AnnotationMetadata importingClassMetadata) {
//    return ClassUtils.getPackageName(importingClassMetadata.getClassName());
//  }
//
//  /**
//   * A {@link MapperScannerRegistrar} for {@link MapperScans}.
//   *
//   * @since 2.0.0
//   */
//  static class RepeatingRegistrar extends MapperScannerRegistrar {
//    /**
//     * {@inheritDoc}
//     */
//    @Override
//    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//      AnnotationAttributes mapperScansAttrs = AnnotationAttributes
//          .fromMap(importingClassMetadata.getAnnotationAttributes(MapperScans.class.getName()));
//      if (mapperScansAttrs != null) {
//        AnnotationAttributes[] annotations = mapperScansAttrs.getAnnotationArray("value");
//        for (int i = 0; i < annotations.length; i++) {
//          registerBeanDefinitions(importingClassMetadata, annotations[i], registry,
//              generateBaseBeanName(importingClassMetadata, i));
//        }
//      }
//    }
//  }
//
//}
//
